package com.liuugoqing.creator.builder.phone;

/**
 * 模式扩展
 *     建造者模式除了上面的用途外，在开发中还有一个常用的使用方式，就是当一个类构造器需要传入很多参数时，
 * 如果创建这个类的实例，代码可读性会非常差，而且很容易引入错误，此时就可以利用建造者模式进行重构。
 * @Author : liugq
 * @Date : 2022/7/2 11:22
 * @See : 参考类
 * @Since： JDK1.8
 * @Version : 1.0
 */
public class Phone {
    private String cpu;
    private String screen;
    private String memory;
    private String mainboard;

    private Phone(Build build){
        this.cpu = build.cpu;
        this.screen = build.screen;
        this.memory = build.memory;
        this.mainboard = build.mainboard;
    }

    /**
     * 使用内部类进行构造模式，构建Phone对象
     */
    public static final class Build{
        private String cpu;
        private String screen;
        private String memory;
        private String mainboard;

        public Build() {}

        /**
         * 返回值为Build，是为了链式编程
         * @param val
         * @return
         */
        public Build cpu(String val) {
            cpu = val;
            return this;
        }

        public Build screen(String val) {
            screen = val;
            return this;
        }

        public Build memory(String val) {
            memory = val;
            return this;
        }

        public Build mainboard(String val) {
            mainboard = val;
            return this;
        }

        /**
         * 使用 builder 方法构建Phone
         * @return
         */
        public Phone builder(){
            return new Phone(this);
        }
    }


    @Override
    public String toString() {
        return "Phone{" +
                "cpu='" + cpu + '\'' +
                ", screen='" + screen + '\'' +
                ", memory='" + memory + '\'' +
                ", mainboard='" + mainboard + '\'' +
                '}';
    }
}
